快速开始
NiBabel支持不断增长的神经影像文件格式。每个文件格式格式都有自己的特点和特点,需要注意充分利用它。为此,NiBabel提供了高级格式无关的访问神经元图像,以及一个API的各种级别的格式特定的访问特定文件格式的所有可用信息。下面的例子展示了一些NiBabel的功能,并给你一个API的概念。
有关API的更多详细信息,请参阅Nibabel图像。
加载图像时,NiBabel试图从文件名中找出图像格式。一个已知格式的图像可以通过简单地将其文件名传递给load
函数来轻松加载。
为了启动代码示例,我们加载一些有用的库:
>>> import os
>>> import numpy as np
然后,我们罚了包含示例数据的nibabel目录:
>>> from nibabel.testing import data_path
在这个目录中有一个NIfTI文件叫做example4d.nii.gz
:
>>> example_filename = os.path.join(data_path, 'example4d.nii.gz')
Now we can import nibabel and load the image:
现在我们可以导入nibabel并加载图像:
>>> import nibabel as nib
>>> img = nib.load(example_filename)
一个NiBabel图像知道它的形状:
>>> img.shape
(128, 96, 24, 2)
它还记录存储在磁盘上的数据的数据类型。在这种情况下,磁盘上的数据是16位有符号整数:
>>> img.get_data_dtype() == np.dtype(np.int16)
True
图像具有仿射变换,用于确定图像元素的世界坐标(请参阅坐标系和仿射):
>>> img.affine.shape
(4, 4)
这些信息可以不需要将任何主图像数据加载到存储器中。当然,也可以作为NumPy数组访问图像数据
>>> data = img.get_data()
>>> data.shape
(128, 96, 24, 2)
>>> type(data)
<... 'numpy.ndarray'>
图像标题中嵌入的完整信息可通过格式特定的标题对象获得。
>>> hdr = img.header
在这个NIfTI文件的情况下,它允许访问所有NIfTI特定的信息,例如
>>> hdr.get_xyzt_units()
('mm', 'sec')
对应的“setter”方法允许修改标题,同时确保其符合文件格式规范。
在某些情况下,我们需要更多的灵活性,并且以极大的勇气,NiBabel还提供了对原始头信息的访问
>>> raw = hdr.structarr
>>> raw['xyzt_units']
array(10, dtype=uint8)
这个API的最低级别是为那些知道文件格式的人设计的,可以处理内部数据,而且没有任何安全网。
以某种文件格式创建新的图像也很容易。至少它只需要一些图像数据和一个图像坐标变换(仿射):
>>> import numpy as np
>>> data = np.ones((32, 32, 15, 100), dtype=np.int16)
>>> img = nib.Nifti1Image(data, np.eye(4))
>>> img.get_data_dtype() == np.dtype(np.int16)
True
>>> img.header.get_xyzt_units()
('unknown', 'unknown')
在这种情况下,我们使用单位矩阵作为仿射变换。图像头是从提供的数据数组(即shape,dtype)初始化的,所有其他值都被设置为合理的默认值。
将这个新的图像保存到一个文件是微不足道的。我们不会在这里做,但它看起来像:
img.to_filename(os.path.join('build','test4d.nii.gz'))
要么:
nib.save(img, os.path.join('build','test4d.nii.gz'))
这个简短的介绍只是简要介绍了NiBabel的功能。请查看API文档以获取有关支持的文件格式及其功能的更多详细信息。